// Path: tenacity-core/src/main/java/com/yammer/tenacity/core/properties/TenacityPropertyKey.java
// public interface TenacityPropertyKey extends HystrixCommandKey, HystrixThreadPoolKey {
//     default Predicate<TenacityPropertyKey> isEqualPredicate() {
//         return (value) -> value.name().equals(name());
//     }
// 
//     default TenacityPropertyKey validate(Collection<TenacityPropertyKey> keys) {
//         return keys.stream()
//                 .filter(isEqualPredicate())
//                 .findAny()
//                 .orElseThrow(() -> new NoSuchElementException("No TenacityPropertyKey " + name()));
//     }
// }


import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
import com.yammer.tenacity.core.properties.TenacityPropertyKey;
import com.yammer.tenacity.core.properties.TenacityPropertyKeyFactory;
import javax.ws.rs.ext.ExceptionMapper;
import java.util.Optional;
import static com.google.common.base.Preconditions.checkNotNull;
package com.yammer.tenacity.core.bundle;




public abstract class AbstractTenacityPropertyKeys {
    protected final Iterable<TenacityPropertyKey> keys;
    protected final TenacityPropertyKeyFactory keyFactory;
    protected final Iterable<ExceptionMapper<? extends Throwable>> exceptionMappers;
    protected final Optional<HystrixCommandExecutionHook> executionHook;

    public AbstractTenacityPropertyKeys(TenacityPropertyKeyFactory keyFactory,
// Path: tenacity-core/src/main/java/com/yammer/tenacity/core/properties/TenacityPropertyKey.java
// public interface TenacityPropertyKey extends HystrixCommandKey, HystrixThreadPoolKey {
//     default Predicate<TenacityPropertyKey> isEqualPredicate() {
//         return (value) -> value.name().equals(name());
//     }
// 
//     default TenacityPropertyKey validate(Collection<TenacityPropertyKey> keys) {
//         return keys.stream()
//                 .filter(isEqualPredicate())
//                 .findAny()
//                 .orElseThrow(() -> new NoSuchElementException("No TenacityPropertyKey " + name()));
//     }
// }


// Path: tenacity-core/src/main/java/com/yammer/tenacity/core/bundle/AbstractTenacityPropertyKeys.java
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
import com.yammer.tenacity.core.properties.TenacityPropertyKey;
import com.yammer.tenacity.core.properties.TenacityPropertyKeyFactory;
import javax.ws.rs.ext.ExceptionMapper;
import java.util.Optional;
import static com.google.common.base.Preconditions.checkNotNull;

package com.yammer.tenacity.core.bundle;




public abstract class AbstractTenacityPropertyKeys {
    protected final Iterable<TenacityPropertyKey> keys;
    protected final TenacityPropertyKeyFactory keyFactory;
    protected final Iterable<ExceptionMapper<? extends Throwable>> exceptionMappers;
    protected final Optional<HystrixCommandExecutionHook> executionHook;

    public AbstractTenacityPropertyKeys(TenacityPropertyKeyFactory keyFactory,
                                        Iterable<TenacityPropertyKey> keys) {